Laravelのファイル保存先をS3に変更してみた
こんにちは、コンサル部@大阪オフィスのTodaです。
PHP LaravelにはSFTPやRackspace、Amazon S3などにファイルを保存をするパッケージが用意されています。 今回はAmazon S3に保存できる状態まで試してみたいと思います。
構成イメージ
今回、新規でS3バケットの作成とEC2からアクセスする用にIAMロール、ポリシーの作成をしております。
検証用のS3バケット作成
S3バケットを作成
ファイルの保存先としてS3を新規作成します。
AWSマネージメントコンソール上からサービス > S3を選択します。
S3画面に移動したら一覧上部の[バケットを作成]をクリックします。
設定を入力
S3バケットに設定する内容を入力します。
今回はバケット名のみ設定をして[バケットを作成]をクリックします。
作成完了
バケットの作成成功のメッセージが表示されたら、作成は完了です。
S3アクセス用のIAMロール・ポリシー作成
IAMロール作成
作成したS3にEC2からアクセスするためにロールの登録をします。
AWSマネージメントコンソール上からサービス > IAM を選択、サブメニューからロールを選択します。
ロール画面に移動したら[ロールの作成]をクリックします。
ロールの種類を選択
ユースケースの選択に表示されている[EC2]を選択します。
選択後、画面下の[次のステップ]をクリックします。
ポリシーの作成
今回は作成したS3のみアクセスできる権限を準備するため独自のポリシーを設定します。
上部の[ポリシーの作成]をクリックします。
ポリシーの設定
JSONタブを選択して、ポリシーの内容を入力します。
ポリシーは作成したS3の権限を付与するように設定します。
入力後、[ポリシーの確認]をクリックします。
// ポリシーの内容 { "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::*" ], "Effect": "Allow" }, { "Action": "*", "Resource": [ "arn:aws:s3:::[許可をするバケット名]", "arn:aws:s3:::[許可をするバケット名]/*" ], "Effect": "Allow" } ] }
ポリシーの確認
内容を確認して問題なければポリシー名を入力して[ポリシーの作成]をクリックします。
ポリシーの作成完了
ポリシーの作成が完了します。 完了をしたらウィンドウを閉じて先ほどのロール作成画面に戻ります。
作成したポリシーの選択
先ほど作成したポリシーを表示するため右の更新ボタンを押して一覧内容を更新してください。
検索に先ほど指定したポリシー名を入力して選択をします。
選択後、[次のステップ]をクリックします。
タグの指定
内容は変更せず、[次のステップ]をクリックします。
ロール作成の確認
内容を確認して問題なければロール名を入力して[ロールの作成]をクリックします。
ロール作成の完了
上記でロールの作成は完了なります。
EC2にIAMロールをアタッチ
対象のEC2を選択してIAMロールの選択へ
AWSマネージメントコンソール上からサービス > EC2を選択します。
EC2画面に移動したらLaravelが導入されているインスタンスを選択してアクション > セキュリティ > IAMロールの変更を選択します。
IAMロールの選択
IAMロールの選択肢に先ほど作成した物が表示されます。
選択をした状態で[保存]をクリックします。
IAMロールの変更完了
上記でインスタンスに設定されているIAMロールの設定は変更完了となります。
インスタンス詳細のIAMロール欄を確認して設定できているかを合わせて確認します。
LaravelにS3を設定する
S3用のパッケージをインストール
Laravelの公式サイトで掲載されているleague/flysystem-aws-s3-v3をインストールします。
cd [Laravelの保存ディレクトリ] composer require league/flysystem-aws-s3-v3
S3の環境情報を登録
同ディレクトリ内にある.envファイルにS3の環境情報を入力します。
EC2にS3アクセス用のIAMロールを設定しているためアクセスキーとシークレットキーは空白で登録します。
cd [Laravelの保存ディレクトリ] vi .env AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=ap-northeast-1 ※東京リージョン AWS_BUCKET=[バケット名]
ファイル保存処理を変更
プログラム内のファイル保存処理をS3に格納するように変更します。
vi [Controllerディレクトリ内のファイルアップ処理] // $request->file('file')->store(''); $file = $request->file('file'); Storage::disk('s3')->putFile('/', $file);
実際に試してみる
テストデータをLaravelのファイルアップロードで上げたところ、EC2のストレージではなく、S3に保存されている事を確認しました。
さいごに
Laravelのファイル保存先をS3に変更してみた。
今回はプライベートのS3に保存しているためファイルを掲載する事ができない状態になっています。
ファイルを掲載する場合は追加で対応する事がございますので別記事でご案内できればと思います。